#Pratica 9:

#O objetivo do programa eh encontrar o produto escalar entre dois vetores de numeros em ponto flutuante. O produto escalar
#eh obtido multiplicando os dois vetores, de mesmo tamanho, fazendo cada elemento do primeiro vetor multiplicar pelo #elemento correspondente do segundo valor, e somando todas #as multiplicacoes.

.section .data

titulo:		.asciz "\n*** Programa Multiplca Vetores Ponto Flutuante 1.0*** \n\n"
pedeTam:	.asciz "\nTamanho dos vetores de A e B: "
pedeVet:	.asciz "\nDigite os elementos do vetor %c: "

formato1:	.asciz "%d"
formato2:	.asciz "%lf"
pedeNum:	.asciz "\n%c[%d] = "

mostraVet:	.asciz "\n\nElementos Lidos do vetor %c: \n"
mostraNum:	.asciz "n%lf"
mostraPE:	.asciz "\n\nProduto Escalar = %lf\n"

pulaLin:	.asciz "\n"

maxTam:		.int	50
tam:		.int	0
num:		.double	0
prodEsc:	.double 0

vetorA:		.int	0	#ponteiro para o vetor A
vetorB:		.int	0	#ponteiro para o vetor B

A:		.byte	'A'
B:		.byte	'B'
vet:		.byte	' '


.section .text

.global main

main:

	pushl	$titulo
	call	printf
	finit

leTam:			#rotina que le o tamanho dos vetores (numero de elementos)
	pushl	$pedeTam
	call	printf
	pushl	$tam
	pushl	$formato1
	call	scanf	
	addl	$12, %esp	#descarta os 3 pushls anteriores
	movl	tam, %ecx
	cmpl	$0, %ecx
	jle	leTam
	cmpl	maxTam, %ecx
	jg	leTam

criaVetores:	#rotina que aloca espaco de memoria para alocar os 2 vetores
	movl	$8, %eax	# 8 bytes cada elemento
	mull	%ecx
	pushl	%eax
	call 	malloc		#retorna endereco em %eax
	movl	%eax, vetorA
	call	mallocrintNum:

	fldl	(%edi)
	addl	$8, %edi
	pushl	%edi
	pushl	%ecx
	subl	$8, %esp
	fstpl 	(%esp)
	pushl	$mostraNum
	call	printf
	addl	$12, %esp
	popl	%ecx
	popl	%edi
	loop	printNum

	ret
	movl	%eax, vetorB
	addl	$4, %esp

levetores:
	movl	$0,%eax
	movb	A, %al
	movb	%al, vet
	pushl	%eax
	pushl	$pedeVet
	call	printf
	addl	$8, %esp
	movl	vetorA, %edi
	movl	tam, %ecx
	call	leNum
	movl	$0, %eax
	movb	B, %al
	movb	%al, vet
	pushl	%eax
	pushl	$pedeVet
	call	printf
	addl	$8, %esp
	movl	vetorB, %edi
	movl	tam, %ecx
	call	leNum
	jmp printVetores
	

	
leNum:
	pushl	%edi
	pushl	%ecx
	movl	$0, %eax
	movb	vet, %al
	pushl	%eax
	pushl	$pedeNum
	call	printf
	pushl	$num
	pushl	$formato2
	call 	scanf

	addl	$16, %esp		#remove os quatro ultimos pushls
	popl	%ecx
	popl	%edi

	fldl	num
	fstpl	(%edi)
	addl	$8, %edi
	loop	leNum

	ret

printVetores:

	movl	$0, %eax
	movb	A, %al
	movb	%al, vet
	pushl	%eax
	pushl 	$mostraVet
	call 	printf
	addl	$8, %esp
	movl	tam, %ecx
	movl	vetorA, %edi
	call	printNum

	movl	$0, %eax
	movb	B, %al
	movb	%al, vet
	pushl	%eax
	pushl	$mostraVet
	call 	printf
	addl	$8, %esp
	movl	tam, %ecx
	movl	vetorB, %edi
	call	printNum
	jmp	calcPE

printNum:

	fldl	(%edi)
	addl	$8, %edi
	pushl	%edi
	pushl	%ecx
	subl	$8, %esp
	fstpl 	(%esp)
	pushl	$mostraNum
	call	printf
	addl	$12, %esp
	popl	%ecx
	popl	%edi
	loop	printNum

	ret

calcPE:

	movl	tam, %ecx
	movl	vetorA, %edi
	movl	vetorB, %esi

voltaPE:

	fldl 	(%edi)
	fmull	(%esi)
	faddl	prodEsc
	fstpl	prodEsc
	addl	$8, %edi
	addl	$8, %esi
	loop	voltaPE

printPE:

	fldl	prodEsc
	subl	$8, %esp

	fstpl	(%esp)

	pushl	$mostraPE
	call	printf
	
	addl	$12, %esp

fim:
	pushl	$0
	call 	exit



 
